home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / c3 / pro24 / dxget.c < prev    next >
C/C++ Source or Header  |  1986-08-07  |  7KB  |  195 lines

  1. /* dxget.c -- program to get Yamaha exclusive messages and write to file */
  2.  
  3. /*****************************************************************************
  4. *        Change Log
  5. *  Date        | Change
  6. *-----------+-----------------------------------------------------------------
  7. * 13-Jun-86 | Created Change Log
  8. *****************************************************************************/
  9.  
  10. #include "cext.h"
  11. #include "stdio.h"
  12. #include "mpu.h"
  13. #include "midicode.h"
  14. #include "userio.h"
  15. #include "cmdline.h"
  16.  
  17. #define buffsize 17000
  18. byte midibuff[buffsize];
  19.  
  20. extern int xbufftail;
  21. extern int xbuffmask;
  22. extern byte *xbuff;
  23. extern byte *buff;
  24.  
  25. int xflag;    /* for debugging */
  26.  
  27. int debptr;
  28.  
  29. /****************************************************************************
  30. * Data for command line parsing
  31. ****************************************************************************/
  32. #define nswitches 8
  33. private char *switches[nswitches] = 
  34.     { "-help", "-miditrace", "-m", "-trace", "-t", "-block", "-d", "-debug" };
  35.  
  36. #define noptions 1
  37. private char *options[noptions] = { "-tune" };
  38.  
  39. /*****************************************************************************
  40. *    Routines local to this module
  41. *****************************************************************************/
  42. private void instruct();
  43. private boolean output();
  44.  
  45. /****************************************************************************
  46. *                instruct
  47. * Effect: prints instructions for this routine
  48. ****************************************************************************/
  49.  
  50. private void instruct()
  51. {
  52. printf("This program will let you save DX7 and TX816 voice programs.\n");
  53. printf("To save DX7 programs, you must connect\n");
  54. printf("    DX7 MIDI OUT to MPU 401 MIDI IN.\n");
  55. printf("For TX816 programs, connect TX816 MIDI OUT to MPU 401 MIDI IN,\n");
  56. printf("    and set the OUT SLOT (leftmost display) to the module\n");
  57. printf("    from which you want data.\n");
  58. printf("For DX7: push the orange FUNCTION key, then the green 8.  Push 8\n");
  59. printf("    repeatedly until the display says SYS INFO AVAIL or\n");
  60. printf("    SYS INFO UNAVAIL.  If the display says SYS INFO UNAVAIL,\n");
  61. printf("    push YES to change the display to SYS INFO AVAIL.\n");
  62. printf("    Now, select a voice with the INTERNAL or CARTRIDGE button\n");
  63. printf("    followed by a (green) number.\n");
  64. printf("For ALL DX7 voices: after getting the SYS INFO AVAIL display,\n");
  65. printf("    push 8 again to get MIDI TRANSMIT ?.  Push YES.\n");
  66. printf("For TX816: Hold down SELECT until you see UT in the display.\n");
  67. printf("    Let up on SELECT and then push it once more to get the\n");
  68. printf("    flashing dU.  Push YES to dump all data from this module.\n");
  69. printf("    Hold down SELECT until you see digits in the display.\n");
  70. printf("After data is dumped, dxget will tell you what it got and write\n");
  71. printf("    data to a file.     Use dxput to copy a file to a dx module.\n");
  72. }
  73.  
  74. /****************************************************************************
  75. *                main
  76. * Effect: main program -- prompt user for information and get data
  77. ****************************************************************************/
  78. void main(argc, argv)
  79.     int argc;
  80.     char *argv[];
  81. {
  82.     FILE *fp;        /* the output file */
  83.     int done = false;    /* flag is true when user is done */
  84.     byte *msg;        /* message pointer */
  85.     char filename[100];    /* the output file name */
  86.     char *s;        /* the file name in the command line */
  87.  
  88.     cl_init(switches, nswitches, options, noptions, argv, argc);
  89.     if (cl_switch("-help")) instruct();
  90.     /* get input file name: */
  91.     filename[0] = NULL;    /* empty string */
  92.     if ((s = cl_arg(1)) != NULL) strcpy(filename, s);
  93.  
  94.     while (!done) {
  95.     if (askbool("Do you want instructions", true)) instruct();
  96.     
  97.     fp = fileopen(filename, "dx7", "w", "file name");
  98.  
  99.     musicinit();
  100.     if (!midi_buffer(midibuff, buffsize)) printf("midi_buffer error\n");
  101.     while (getkey(false) != -1) ;
  102.     exclusive(true);    /* tell mpu401 to send exclusive data */
  103.  
  104.     printf("\nReady for your data. Type space when you are done...\n");
  105.  
  106.     done = false;
  107.     while (!done) {
  108.         if (kbhit()) done = (getch() == ' ');
  109.         mpu_error_check();    /* look for buffer overflow */
  110.     }
  111.  
  112.     musicterm();
  113.  
  114.     msg = midibuff;
  115.     if (xbufftail == 0) printf("No data!  Please start again.\n");
  116.     else while (output(fp, &msg, midibuff + xbufftail))
  117.          /* write messages */;
  118.     fclose(fp);
  119.     printf("DONE\n");
  120.  
  121.     done = !askbool("Do you want to send another file", false);
  122.     filename[0] = NULL;    /* force prompt for new file name */
  123.     }
  124. }
  125.  
  126. /****************************************************************************
  127. *                output
  128. * Inputs:
  129. *    FILE *fp: the file to write
  130. *    byte **msg: pointer to the message to write
  131. *    byte *msg_tail: points to byte after last byte of recorded data
  132. * Outputs:
  133. **    byte **msg: is advanced to byte after the last byte of the message
  134. *    returns true if there is more data to output
  135. * Effect: 
  136. *    write data file using recorded data
  137. * Assumes:
  138. *    fp is opened for writing
  139. *    msg_tail > *msg
  140. ****************************************************************************/
  141.  
  142. private boolean output(fp, msg, msg_tail)
  143.     FILE *fp;
  144.     byte **msg;
  145.     byte *msg_tail;
  146. {
  147.     byte *this_msg = *msg;    /* local message pointer */
  148.     int datalen;        /* number of bytes in message */
  149.     int cksum;            /* check sum of message */
  150.     int n;            /* counts bytes printed on one line */
  151.  
  152. /*    printf("*msg %x, this_msg %x, msg_tail %x\n",
  153.  *        *msg, this_msg, msg_tail);
  154.  *    printf("%d bytes to go.\n", msg_tail - this_msg);
  155.  */
  156.     excldesc(this_msg);
  157. /*    for (i = *base; i < how_many; i+=4) {
  158.  *        if (kbhit() && (getch() == ' ')) break;
  159.  *        printf("%d: %x %x %x %x\n",
  160.  *        i, 
  161.  *        midibuff[i],
  162.  *        midibuff[i+1],
  163.  *        midibuff[i+2],
  164.  *        midibuff[i+3]);
  165.  *    }
  166.  */
  167.     this_msg = *msg;
  168. /*    printf("parity check\n");*/
  169.     datalen = (this_msg[4] << 7) + this_msg[5];
  170. /*    printf("datalen %x\n", datalen);*/
  171.     cksum = 0;
  172.     for (n = 6; n < datalen+6; n++) {
  173.     cksum = (cksum + this_msg[n]) & 0x7f;
  174.     }
  175. /*    printf("computed check sum %x, actual check sum %x\n",
  176.         cksum, midibuff[datalen+6]);*/
  177.     if ((cksum + this_msg[datalen+6]) & 0x7f != 0) {
  178.     fprintf(stderr, "Data has been garbled -- please start over.\n");
  179.     return false;
  180.     }
  181.     n = 0;
  182.     do {    /* always print first byte, */
  183.         /* then terminate after printing MIDI_EOX */
  184.     fprintf(fp, "%x ", *this_msg);
  185.     if (n >= 15) {        /* print 16 bytes per line */
  186.         n = 0;
  187.         fprintf(fp, "\n");
  188.     } else n++;
  189.     this_msg++;
  190.     } while (this_msg < msg_tail && *(this_msg-1) != MIDI_EOX) ;
  191.     fprintf(fp, "\n\n");
  192.     *msg = this_msg;
  193.     return this_msg < msg_tail;
  194. }
  195.